﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace App_Persistencia
{
    public class Presupuesto_Data
    {
        int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        int cantPersonas;

        public int CantPersonas
        {
            get { return cantPersonas; }
            set { cantPersonas = value; }
        }
        
        string comentario;

        public string Comentario
        {
            get { return comentario; }
            set { comentario = value; }
        }

        DateTime fechaCreacion;

        public DateTime FechaCreacion
        {
            get { return fechaCreacion; }
            set { fechaCreacion = value; }
        }

        DateTime fechaEvento;

        public DateTime FechaEvento
        {
            get { return fechaEvento; }
            set { fechaEvento = value; }
        }
        
        Presupuesto_Estado_Data pEstado = new Presupuesto_Estado_Data();

        public Presupuesto_Estado_Data PEstado
        {
            get { return pEstado; }
            set { pEstado = value; }
        }
                
        List<Presupuesto_Detalles_Data> presupuestoDetalle = new List<Presupuesto_Detalles_Data>();
        
        public List<Presupuesto_Detalles_Data> PresupuestoDetalle
        {
            get { return presupuestoDetalle; }
            set { presupuestoDetalle = value; }
        }

        List<Servicio_Adicional_Data> servicioAdicional = new List<Servicio_Adicional_Data>();

        public List<Servicio_Adicional_Data> ServicioAdicional
        {
            get { return servicioAdicional; }
            set { servicioAdicional = value; }
        }

        List<Presupuesto_Bebida_Data> bebidas = new List<Presupuesto_Bebida_Data>();

        public List<Presupuesto_Bebida_Data> Bebidas
        {
            get { return bebidas; }
            set { bebidas = value; }
        }
        //List<Bebida_Data> bebida = new List<Bebida_Data>();

        //public List<Bebida_Data> Bebida
        //{
        //    get { return bebida; }
        //    set { bebida = value; }
        //}
        
        EventoTipo_Data tipoEvento;

        public EventoTipo_Data TipoEvento
        {
            get { return tipoEvento; }
            set { tipoEvento = value; }
        }

        Salon_Data salon;

        public Salon_Data Salon
        {
            get { return salon; }
            set { salon = value; }
        }

        Cliente_Data cliente;

        public Cliente_Data Cliente
        {
            get { return cliente; }
            set { cliente = value; }
        }
        
        public void guardarPresupuesto()
        {
            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarPresupuesto";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@fechaCreacion", FechaCreacion);// "8/20/2009 12:53:55 AM"
                param.DbType = DbType.DateTime;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@fechaEvento", FechaEvento);// "8/20/2009 12:53:55 AM"
                param.DbType = DbType.DateTime;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@estado_Id", pEstado.Numero);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@observacion", comentario);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@cantPersonas", CantPersonas);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDNI
                param = command.Parameters.AddWithValue("@tipoEventoId", TipoEvento.Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;


                if (Salon.Id != 0)
                {
                    // Establesco el parametro @SocTelefono
                    param = command.Parameters.AddWithValue("@salonId", Salon.Id);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;
                }
                else {
                    param = command.Parameters.AddWithValue("@salonId", -1);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;
                }

                // Establesco el parametro @SocDirNumero
                param = command.Parameters.AddWithValue("@clienteId", Cliente.ClienteId);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDirDepto
                param = command.Parameters.AddWithValue("@preId", Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Output;

              
                // Ejecuto el procedimiento
                command.ExecuteNonQuery();

                id = Convert.ToInt32(command.Parameters["@preId"].Value);

                cargarDetalleBebida(transaccion, connection);
                cargarDetalleServicioAdicional(transaccion, connection);
                cargarDetallePresupuesto(transaccion, connection);

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);
                
                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }
        
        }

        public void cargarDetalleBebida(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < Bebidas.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                //commandDetalle.CommandText = "spCargarPresupuestoxBebida";
                commandDetalle.CommandText = "spCargarPresupuestoxBebida";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@PresupuestoId", Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@BebidaId", Bebidas[i].Bebida.Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                //agrego

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@Cantidad", Bebidas[i].CantidadBebida);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                //fin agrego

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();
                
            }
        }
        
        public void cargarDetalleServicioAdicional(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < ServicioAdicional.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "spCargarPresupuestoxServicio";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@PresupuestoId", Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@ServAdicId", ServicioAdicional[i].Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();

            }
        }
        
        public void cargarDetallePresupuesto(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < PresupuestoDetalle.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "spCargarDetallePresupuesto";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@PresupuestoId", Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@MenuId", PresupuestoDetalle[i].Menu.Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@Precio", PresupuestoDetalle[i].PrecioCosto);
                paramDetalle.DbType = DbType.Double;
                paramDetalle.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();

            }
        }

        public DataTable popularPresupuestos()
        {
            //Creo la sentencia SQL
            //string commandSQL = "SELECT pre_Id, pre_FechaCreacion, pre_FechaEvento, pre_CantPersonas, tipoEvento_Id, salon_Id, cliente_Id "
            //                   + "FROM Presupuesto ORDER BY pre_FechaCreacion";


            string commandSQL = "SELECT     Presupuesto.pre_Id as Nro, Presupuesto.pre_FechaCreacion as Fecha, Cliente.cli_Nombre as Nombre, Cliente.cli_Apellido as Apellido,Cliente.cli_Email AS Email, Presupuesto.pre_CantPersonas as Presupuesto, Salon.sal_Nombre AS Salon, Presupuesto.pre_Observacion AS Observacion "
                               + "FROM Presupuesto INNER JOIN Cliente ON Presupuesto.cliente_Id = Cliente.cli_Id INNER JOIN "
                               + " Salon ON Presupuesto.salon_Id = Salon.sal_Id "
                               + "WHERE Presupuesto.estado_Id = 1";


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            //// Obtengo la tabla del DataSet
            //DataTable dataTable = new DataTable();


            //// Relleno el DataTable
            //dataAdapter.Fill(dataTable);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Presupuesto");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Presupuesto"];

            return dataTable;
        }

        public DataTable popularPresupuestosEnviados()
        {
            //Creo la sentencia SQL
            string commandSQL = " SELECT     Presupuesto.pre_Id AS Nro, Presupuesto.pre_FechaCreacion AS Fecha, Cliente.cli_Nombre AS Nombre, Cliente.cli_Apellido AS Apellido, "
                                +" Cliente.cli_Email AS Email, Presupuesto.pre_CantPersonas AS Presupuesto, Salon.sal_Nombre AS Salon, "
                                +" Presupuesto.pre_Observacion AS Observacion, Cliente.cli_Id AS ClienteId, Presupuesto.pre_FechaEvento AS FechaEvento, "
                                +" Presupuesto.tipoEvento_Id AS TipoEventoId, Salon.sal_Id AS SalonId "
                                +" FROM Presupuesto INNER JOIN "
                                +" Cliente ON Presupuesto.cliente_Id = Cliente.cli_Id INNER JOIN "
                                +" Salon ON Presupuesto.salon_Id = Salon.sal_Id "
                                +" WHERE     (Presupuesto.estado_Id = 2)";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Presupuesto");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Presupuesto"];

            return dataTable;
        }

        public void cambiarEstadoYPrecioPresupuesto()
        {


            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "UPDATE Presupuesto SET estado_Id =" + this.PEstado.Numero + " "
                                      + " WHERE Presupuesto.pre_Id = " + this.Id.ToString();
                command.CommandType = CommandType.Text;

                // Ejecuto el procedimiento
                command.ExecuteNonQuery();

                //id = Convert.ToInt32(command.Parameters["@preId"].Value);

                cambiarPrecioMenu(transaccion, connection);

                //cargarDetalleServicioAdicional(transaccion, connection);
                //cargarDetallePresupuesto(transaccion, connection);

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);
                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }

        }

        public void cambiarPrecioMenu(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < PresupuestoDetalle.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "UPDATE Presupuesto_Detalle SET preDet_Precio_Venta =" + PresupuestoDetalle[i].PrecioVenta + " "
                                            + " WHERE Presupuesto_Detalle.presupuesto_Id = " + this.Id.ToString() + " and Presupuesto_Detalle.menu_Id = " + presupuestoDetalle[i].Menu.Id.ToString();
                commandDetalle.CommandType = CommandType.Text;

                commandDetalle.ExecuteNonQuery();

            }
        }
        public DataTable traerPresupuestosNuevos()
        {

            string commandSQL = "SELECT        Cliente.cli_Nombre AS cli_nombre, Cliente.cli_Apellido AS cli_apellido, Presupuesto.pre_FechaCreacion AS fechaCreacion, "
                         + "Presupuesto.pre_FechaEvento AS fechaEvento, Presupuesto.pre_Id, Evento_Tipo.tEve_Nombre AS Evento "
+ "FROM            Presupuesto INNER JOIN "
                         + "Cliente ON Presupuesto.cliente_Id = Cliente.cli_Id INNER JOIN "
                         + "Evento_Tipo ON Presupuesto.tipoEvento_Id = Evento_Tipo.tEve_Id "
+ "WHERE        (Presupuesto.estado_Id = 1)";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            //// Obtengo la tabla del DataSet
            //DataTable dataTable = new DataTable();


            //// Relleno el DataTable
            //dataAdapter.Fill(dataTable);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Presupuesto");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Presupuesto"];

            return dataTable;
        }
        public DataTable popularPresupuestos(int i)
        {
            //Creo la sentencia SQL
            //string commandSQL = "SELECT pre_Id, pre_FechaCreacion, pre_FechaEvento, pre_CantPersonas, tipoEvento_Id, salon_Id, cliente_Id "
            //                   + "FROM Presupuesto ORDER BY pre_FechaCreacion";


            string commandSQL = "SELECT     Presupuesto.pre_Id as Nro, Presupuesto.pre_FechaCreacion as Fecha, Cliente.cli_Nombre as Nombre, Cliente.cli_Apellido as Apellido,Cliente.cli_Email AS Email, Presupuesto.pre_CantPersonas as Presupuesto, Salon.sal_Nombre AS Salon, Presupuesto.pre_Observacion AS Observacion "
                               + "FROM Presupuesto INNER JOIN Cliente ON Presupuesto.cliente_Id = Cliente.cli_Id INNER JOIN "
                               + " Salon ON Presupuesto.salon_Id = Salon.sal_Id "
                               + "WHERE Presupuesto.estado_Id = 1 AND Presupuesto.pre_Id = " + i;


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            //// Obtengo la tabla del DataSet
            //DataTable dataTable = new DataTable();


            //// Relleno el DataTable
            //dataAdapter.Fill(dataTable);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Presupuesto");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Presupuesto"];

            return dataTable;
        }
    }
}
